/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ia.perceptron;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Random;

/**
 *
 * @author Igor-Note
 */
public class Neuronio {

    int numPixelsImagem = 3600;
    int numImagens = 136;
    double vetorPesos[] = new double[numPixelsImagem];
    double entradas[][] = new double[numImagens][numPixelsImagem+1];  //estimativa do tamanho da imagem (1500 pixels)
    double bias = -1;
    double tAprendizagem;
    int nEpocas;
    double saida = 0;
    int countsaida = 0;
    public Neuronio() {
        inicializa();
    }

    private void inicializa() {
        Random alea = new Random();
        tAprendizagem = 0.001; //inicializa taxa de aprendizagem
        for (int i=0;i<numPixelsImagem;i++) {    //inicializa vetor de pesos
            vetorPesos[i] = alea.nextDouble();
        }
    }

     public double executar(double[] dados){
        saida=0;
        dados = normalizaDados(dados);
        for (int i=0;i<numPixelsImagem;i++) {
            saida += dados[i]*vetorPesos[i];
        }
        if (saida!=0 && Math.abs(saida-1)<=0.5)
            System.out.println("Mão fechada "+saida);
        else if (saida!=0 && Math.abs(saida-0)<=0.5)
            System.out.println("Mão aberta "+ saida);

        return saida;
    }



     public void treinar(){
        leArquivo();
        nEpocas = 0;
        boolean erro;
        normalizaDados(entradas);
        do{
             erro = false;
             for (int i = 0; i < numImagens-1; i++) {
		saida = executarTreino(entradas[i]);
                if (Math.abs(saida - entradas[i][numPixelsImagem]) >= 0.0001) {
                   atualizarPesos(i, saida);
                   erro = true;
                }
            }
            nEpocas++;
            System.out.println("epocas " + nEpocas);
        }while (erro == true);
        //executar(entradas[12]);
 }

     private void atualizarPesos(int i, double saida) {
        for (int j=0;j<numPixelsImagem-1;j++) {
            vetorPesos[j] = vetorPesos[j]+ tAprendizagem*(entradas[i][numPixelsImagem]-saida)*entradas[i][j];
        }
    }
     
    public void leArquivo() {
        int count = 0;
        try {
            
        BufferedReader in = new BufferedReader(new FileReader("C:/Documents and Settings/Igor/Meus documentos/NetBeansProjects/MetodoGauss/src/imagensbase/dados.txt"));
            String str;
            while (in.ready()) {
                str = in.readLine();
                montaMatriz(str, count);
                count++;

            }
            in.close();

        } catch (IOException e) {
        }

    }

    private void montaMatriz(String linha, int c) {
        String[] partes = new String[numImagens];
        int num;

           partes = linha.split(" ");
            for(int j = 0; j<numPixelsImagem+1; j++){
                num = Integer.parseInt(partes[j]);
                //System.out.println(String.valueOf(c) + " "+ j);
                entradas[c][j] = num;
                //System.out.println("matriz[" +c + "][" +j+ "] = " + entradas[c][j]);
            }
        //}

    }

    public void normalizaDados(double matriz[][]) {
        for (int i=0;i<numImagens;i++) {
            for (int j=0;j<numPixelsImagem+1;j++) {
                if (matriz[i][j]==0){
                    matriz[i][j]=0;
                } else {
                    matriz[i][j]=1;
                }
            }
        }
    }

    public double[] normalizaDados(double matriz[]) {
            for (int j=0;j<numPixelsImagem;j++) {
                if (matriz[j]==0) {
                    matriz[j]=0;
                } else{
                    matriz[j]=1;
                }
        }
       return matriz;
    }

    public static void main(String[] args) {
        Neuronio neura = new Neuronio();
        neura.treinar();
        
    }

    public double executarTreino(double[] entradas){
        saida=0;
        for (int i=0;i<numPixelsImagem;i++) {
            saida += entradas[i]*vetorPesos[i];
        }
        System.out.println(saida);
        return saida;
    }

}
